package collection

import "math/rand"

// 从collection（集合）中获得n个随机元素。
// Fisher-Yates shuffle算法
// 从1到n之间随机出一个数和最后一个数(n)交换，然后从1到n-1之间随机出一个数和倒数第二个数(n-1)交换, 然后取k个元素
func SampleSize(array []T, n ...int) []T {
	if len(array) == 0 {
		return nil
	}
	size := 1
	if len(n) > 0 {
		size = n[0]
	}
	if size <= 0 {
		size = 1
	}
	if size > len(array) {
		size = len(array)
	}
	length := len(array)
	var ret = append([]T{}, array...)
	lastIndex := length - 1
	for index := 0; index < length; index++ {
		var randIndex = index + rand.Intn(lastIndex-index+1)
		ret[randIndex], ret[index] = ret[index], ret[randIndex]
	}
	return ret[:size]
}
